
public class Test {
    public static void main(String[] args) throws InterruptedException {
        // 在Java程序中，一个线程对象只能调用一次start()方法启动新线程，并在新线程中执行run()方法。一旦run()方法执行完毕，线程就结束了。因此，Java线程的状态有以下几种：

        // New：新创建的线程，尚未执行；
        // Runnable：运行中的线程，正在执行run()方法的Java代码；
        // Blocked：运行中的线程，因为某些操作被阻塞而挂起；
        // Waiting：运行中的线程，因为某些操作在等待中；
        // Timed Waiting：运行中的线程，因为执行sleep()方法正在计时等待；
        // Terminated：线程已终止，因为run()方法执行完毕。

        // 当线程启动后，它可以在Runnable、Blocked、Waiting和Timed
        // Waiting这几个状态之间切换，直到最后变成Terminated状态，线程终止。

        // 线程终止的原因有：
        // 线程正常终止：run()方法执行到return语句返回；
        // 线程意外终止：run()方法因为未捕获的异常导致线程终止；
        // 对某个线程的Thread实例调用stop()方法强制终止（强烈不推荐使用）。
        // 一个线程还可以等待另一个线程直到其运行结束
        // t.join()等待t线程结束后再继续运行
        // 对已经运行结束的线程调用join()方法会立刻返回
        Thread t = new Thread(() -> {
            System.out.println("子线程正在跑，状态 = " + Thread.currentThread().getState());
            try {
                Thread.sleep(500);
            } catch (InterruptedException ignore) {
            }
        });

        System.out.println("启动前: " + t.getState()); // NEW
        t.start();
        System.out.println("已启动 : " + t.getState()); // RUNNABLE（或 TIMED_WAITING）
        Thread.sleep(100); // 让子线程先睡 500 ms
        System.out.println("子线程 sleep 中: " + t.getState()); // TIMED_WAITING
        t.join(); // 等子线程结束
        System.out.println("结束后: " + t.getState()); // TERMINATED
    }

}
